package com.cty.LinkedList;

//双向链表
public class DoubleLinkedList {
    //创建一个头节点
    private heroNode2 head = new heroNode2(0, "", "");

    //创建添加到尾部的方法
    public void add(heroNode2 heroNode2) {
        //创建一个遍历需要的辅助指针
        heroNode2 temp = head;
        while (true) {
            if (temp.next == null) {
                //添加操作，辅助指针已经到达尾部
                temp.next = heroNode2;
                heroNode2.pre = temp;
                break;
            }
            temp = temp.next;
        }
    }

    //按照顺序添加的方法
    public void addByOrder(heroNode2 heroNode2) {
        //创建一个辅助指针
        heroNode2 temp = head;
        //创建一个可插入位置的标志
        boolean flag = false;
        //链表不为空
        while (true) {
            //此时插入节点是编号最大节点
            if (temp.next == null) {
                break;
            }
            if (temp.next.no > heroNode2.no) {
                break;
            }
            //找链表插入位置
            if (temp.next.no == heroNode2.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            System.out.println("该编号的节点已经存在~~");
            return;
        }
        //判断是否有空指针异常
        if (temp.next != null) {
            heroNode2.pre = temp;
            heroNode2.next = temp.next;
            temp.next.pre = heroNode2;
            temp.next = heroNode2;
        }
        heroNode2.pre = temp;
        temp.next = heroNode2;

    }

    //更新双向链表
    public void update(heroNode2 heroNode2) {
        if (head.next == null) {
            System.out.println("该链表为空链表~~");
            return;
        }
        //创建一个辅助指针
        heroNode2 temp = head.next;
        //创建一个标志，判断是否找到要修改的节点
        boolean flag = false;
        //循环找节点
        while (temp != null) {
            //找到该节点
            if (heroNode2.no == temp.no) {
                //找到要修改的节点
                flag = true;
                break;
            }
            temp = temp.next;
        }
        if (flag) {
            temp.name = heroNode2.name;
            temp.nickName = heroNode2.nickName;
        } else {
            System.out.println("未找到这样的节点~~~");
        }
    }

    //删除双向链表的节点
    public void remove(int no) {
        if (head.next == null) {
            System.out.println("链表为空链表~~~~");
            return;
        }
        //创建一个辅助指针
        heroNode2 temp = head.next;
        //遍历链表
        while (temp != null) {
            if (temp.next == null) {
                System.out.println("没有要删除的节点~~~");
                return;
            }
            //找到节点开始删除
            if (temp.no == no) {
                temp.pre.next = temp.next;
                if (temp.next != null) {
                    temp.next.pre = temp.pre;
                }
                break;
            }
            temp = temp.next;
        }
    }

    //遍历双向链表
    public void list() {
        if (head.next == null) {
            System.out.println("该链表为空链表~~~");
            return;
        }
        //创建一个遍历的辅助指针
        heroNode2 temp = head.next;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }
    }
}
